<style>
    table{ border: 4px double red; border-spacing: 0; }
    th, td { border-bottom: 1px dotted red; border-right: 1px dotted red; padding: 10px;}

</style>

<?php
$db=new PDO("mysql:host=localhost", 'root', '12qwas');
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
$db->exec('create database if not exists db3');
$db->exec('use db3');
$db->exec("create table if not exists students (xh varchar(9) not null primary key,name varchar(50), age int)");
$r=$db->exec('delete from students');
echo "删除记录个数：{$r}条\n";
$r=$db->exec("insert into students(xh,name,age) values
				 ('213110601','张三',18),
				 ('213110602','李四',22),
				 ('213110603','王五',20),
				 ('213110701','杨柳',19)");
echo "插入记录：{$r}条\n";
$r=$db->exec("update students set name='杨柳依依' where xh='213110701'");
echo "更新记录： {$r}条\n";
//$r=$db->exec('select * from students');// exec()不宜用于查询操作
//echo "查询记录： {$r}条\n";
$ps=$db->query('select * from students limit 1');//返回的结果集包含在$ps语句对象中
foreach ($ps as $row){
    print_r($row);
}
echo "=================一次执行多个查询======================\n";
$ps->closeCursor();//关闭游标，使语句能再次被执行
$ps=$db->query("select * from students where xh='213110701';select * from students limit 3");//返回的结果集包含在$ps语句对象中
do {
    foreach ($ps as $row) {
        echo "{$row['xh']}\t{$row['name']}\t{$row['age']}\n";
    }
    echo "----------------------------\n";
}while($ps->nextRowset());//获取下一个记录集，若存在，返回true
echo "=================利用prepare、execute方法进行查询====================\n";
$ps=$db->prepare('select * from students where age<20');//如果不包含占位符，一般就用 $db->query()进行查询
$ps->execute();//结果集包含在 $ps语句对象中
foreach ($ps as $row) {
    echo "1. {$row['xh']}\t{$row['name']}\t{$row['age']}\n";
}
echo "=================利用prepare、execute方法进行查询，使用占位符====================\n";
$ps=$db->prepare('select * from students where age<?');//如果不包含占位符，一般就用 $db->query()进行查询
$ps->execute([20]);//数组中的数据对应占位符，结果集包含在 $ps语句对象中
foreach ($ps as $row) {
    echo "2. {$row['xh']}\t{$row['name']}\t{$row['age']}\n";
}
echo "===============利用limit显示两条记录======================\n";
$ps=$db->prepare('select * from students limit ?');//如果不包含占位符，一般就用 $db->query()进行查询
//$ps->execute([2]);//数组中的数据默认是字符串类型的数据，对应占位符，结果集包含在 $ps语句对象中
$ps->bindValue(1,2, PDO::PARAM_INT);//把值2绑定到第一个？占位置，数据是整数类型
$ps->execute();//占位符的值已经绑定，无需再提供其值
foreach ($ps as $row) {
    echo "3. {$row['xh']}\t{$row['name']}\t{$row['age']}\n";
}
$ps->closeCursor();
echo "==============命名占位符=============\n";
$ps=$db->prepare('select * from students limit :offset, :length'); //使用命名占位符，以冒号:开始
$ps->bindValue(':offset',1,PDO::PARAM_INT); //设置绑定占位符的值及类型
$ps->bindValue(':length',2,PDO::PARAM_INT);
$ps->execute();//执行语句，这里就不用传递数组参数了
foreach ($ps as $r){
    echo "4. {$r['xh']}\t{$r['name']}\t{$r['age']}\n";
}
echo "==============绑定变量到占位符=============\n";
$ps=$db->prepare('select * from students limit :offset, :length');
$ps->bindParam(':offset',$offset,PDO::PARAM_INT);//此变量作为引用被绑定
$ps->bindParam(':length',$length,PDO::PARAM_INT);
$offset=$length=1;
$ps->execute();//只在 PDOStatement::execute()被调用的时候才取绑定变量的值。
foreach ($ps as $r){
    echo "5. {$r['xh']}\t{$r['name']}\t{$r['age']}\n";
}
echo "-----------------------------\n";
$offset=2;
$ps->execute();//只在 PDOStatement::execute()被调用的时候才取绑定变量的值。
foreach ($ps as $r){
    echo "6. {$r['xh']}\t{$r['name']}\t{$r['age']}\n";
}

echo "==============绑定变量到结果集的某一列=============\n";

$ps=$db->prepare('select * from students limit 1,2');
$ps->bindColumn(1,$xh);//通过列号绑定，从1开始
$ps->bindColumn(2,$name);
$ps->bindColumn('age', $age, PDO::PARAM_INT);//通过列名绑定
$ps->execute();
foreach ($ps as $r){
    echo "7. {$xh}\t{$name}\t{$age}\n";//可直接使用绑定到列的变量名
}

echo "==============使用fetch获取一条记录的数组=============\n";
$ps=$db->query('select name from students limit 1 ');
var_dump($ps->fetch());
var_dump($ps->fetch());
echo "==============使用while循环，fetch获取数据集的所有记录=============\n";
$ps=$db->query('select * from students');
while($r=$ps->fetch()){
    echo "8. {$r['xh']}\t{$r['name']}\t{$r['age']}\n";
}

echo "==============使用fetchColumn获取吓一条记录某列的值=============\n";
$ps=$db->query('select count(*) from students'); //这里只有一列，就是记录的个数
echo "记录个数为：{$ps->fetchColumn()}\n";

echo "==============使用fetchAll获取结果集值的所有记录，以数组的形式返回=============\n";
$ps=$db->query('select * from students');
$rs=$ps->fetchAll();//从结果集中取出所有记录，得到的是一个数组，共3个元素
//print_r($rs);
echo "9. {$rs[0]['xh']}\t{$rs[1]['name']}\t{$rs[2]['age']}\n";//第1条记录的学号，第2条的姓名，第3条的年龄
echo "==============使用数据的提取模式 FETCH_ASSOC =============\n";
$ps=$db->query('select * from students limit 1');
$rs=$ps->fetchAll(PDO::FETCH_ASSOC);//得到的是一个数组
print_r($rs);
echo "==============利用table来显示数据 =============\n";
$ps=$db->query('select * from students limit 1');
var_dump("字段个数：".$ps->columnCount());
$ps=$db->prepare('select * from students');
var_dump("字段个数：".$ps->columnCount());

$ps->execute();
var_dump("字段个数：".$ps->columnCount());
print_r($ps->getColumnMeta(0));
table($ps);
function table($ps){
    $count=$ps->columnCount();
    if($count==0)return;//如果$ps中没有结果集，就不用显示，直接返回
    echo "<table><tr>";
    for($i=0;$i<$count;++$i){
        echo "<th>{$ps->getColumnMeta($i)['name']}</th>";
    }
    echo "</tr>";
    foreach($ps as $r){//循环显示每一条记录
        echo "<tr>";
        for($j=0;$j<$count;++$j) {
            echo "<td>", $r[$j]??$r[$ps->getColumnMeta($j)['name']], "</td>";
        }
        echo '</tr>';
    }
    echo "</table>";
}
$db->exec("use db");
$ps=$db->query('select * from chengyu limit 5');
table($ps);